////////////////////////////////////////////////////////////////////////////////

#include "engine.h"
#include "bullet.h"

////////////////////////////////////////////////////////////////////////////////

#include <cassert>
#include <cmath>

////////////////////////////////////////////////////////////////////////////////


Engine::Engine() : m_KeyFlags (0x0)
{
}


////////////////////////////////////////////////////////////////////////////////


Engine::~Engine()
{
}


////////////////////////////////////////////////////////////////////////////////


void Engine::ProcessEvent( Engine::Event _event )
{
    switch (_event)
    {
    case W_DOWN:
        m_Battlefield.GetPlayer().SetKeyFlag(STM::W_KEY);
        break;

    case W_UP:
        m_Battlefield.GetPlayer().UnsetKeyFlag(STM::W_KEY);
        break;

    case S_DOWN:
        m_Battlefield.GetPlayer().SetKeyFlag(STM::S_KEY);
        break;

    case S_UP:
        m_Battlefield.GetPlayer().UnsetKeyFlag(STM::S_KEY);
        break;

    case A_DOWN:
        m_Battlefield.GetPlayer().SetKeyFlag(STM::A_KEY);
        break;

    case A_UP:
        m_Battlefield.GetPlayer().UnsetKeyFlag(STM::A_KEY);
        break;

    case D_DOWN:
        m_Battlefield.GetPlayer().SetKeyFlag(STM::D_KEY);
        break;

    case D_UP:
        m_Battlefield.GetPlayer().UnsetKeyFlag(STM::D_KEY);
        break;

    case MOUSE1_DOWN:
        // Try to shoot in logic section
        m_Battlefield.GetPlayer().SetKeyFlag(STM::MOUSE1);
        break;

    case MOUSE1_UP:
        // Stop shooting in logic section
        m_Battlefield.GetPlayer().UnsetKeyFlag(STM::MOUSE1);
        break;

    default:
        break;
    }

    // Calculate player's velocity
    m_Battlefield.GetPlayer().CalculateVelocity ();
}


////////////////////////////////////////////////////////////////////////////////


void Engine::ProcessMouseMotion( int x, int y )
{
    STM::Position aim(x, y);
    m_Battlefield.GetPlayer().SetAimPosition(aim);
}


////////////////////////////////////////////////////////////////////////////////


void Engine::ProcessLogic()
{
    ProcessCollisions();
    ProcessMovement();
    ProcessShooting();
}


////////////////////////////////////////////////////////////////////////////////


void Engine::ProcessCollisions()
{
    //Not implemented yet
}


////////////////////////////////////////////////////////////////////////////////


void Engine::ProcessMovement()
{
    // Move player
    m_Battlefield.GetPlayer().Move();

    // Move bullets
    Battlefield::Bullets::iterator it = m_Battlefield.GetBullets().begin();
    while ( it != m_Battlefield.GetBullets().end() )
    {
        (*it)->Move();
        it++;
    }
}


////////////////////////////////////////////////////////////////////////////////


void Engine::ProcessShooting()
{
    // Get bullet if the player shoots
    Bullet* bullet = m_Battlefield.GetPlayer().ProcessShooting ();

    if ( bullet )
        m_Battlefield.AddBullet( bullet );
}


////////////////////////////////////////////////////////////////////////////////


const Battlefield& Engine::GetBattlefield() const
{
    return m_Battlefield;
}


////////////////////////////////////////////////////////////////////////////////
